import pandas as pd
import random
from datetime import datetime, timedelta, timezone
import pymongo
from tqdm import tqdm

# ====================
# 预定义的笔记标题和内容模板
# ====================
NOTE_TITLES = [
    "阅读心得与体会",
    "书中精华摘录",
    "读书笔记分享",
    "阅读思考与总结",
    "精彩段落记录",
    "读后感想",
    "重点内容整理",
    "阅读收获与感悟"
]

CONTENT_TEMPLATES = [
    """
    阅读心得
    这本书给我最大的启发是：{insight}。
    作者通过{method}的方式，阐述了{theme}。
    特别值得记录的是：{highlight}。
    """,
    """
    读书笔记
    读完这本书，我深刻理解了{concept}的重要性。
    书中提到的{example}这个例子让我印象深刻。
    我的主要收获：{gain}。
    """,
    """
    摘录与思考
    "{quote}"
    这段话让我想到：{thought}。
    在实际生活中，可以这样应用：{application}。
    """
]

INSIGHTS = [
    "知识改变命运", "坚持就是胜利", "细节决定成败",
    "思维方式的重要性", "时间管理的艺术", "沟通的技巧"
]

THEMES = [
    "人性的复杂性", "社会发展的规律", "科技与人文的关系",
    "历史与现实的联系", "个人成长的方法论", "团队合作的价值"
]

QUOTES = [
    "知识就是力量", "读万卷书，行万里路", "不积跬步，无以至千里",
    "学而不思则罔，思而不学则殆", "天行健，君子以自强不息",
    "知之者不如好之者，好之者不如乐之者"
]


# ====================
# 辅助函数
# ====================

def load_user_ids(num_users=20):
    """生成用户ID列表"""
    return list(range(1, num_users + 1))


def load_book_ids(csv_path, focus_count=5, other_count=10):
    """
    加载图书ID，并分为主要图书和次要图书
    :param csv_path: CSV文件路径 :param focus_count: 主要图书数量
    :param other_count: 次要图书数量
    :return: 主要图书列表, 次要图书列表
    """
    try:
        df = pd.read_csv(csv_path)
        all_books = df['_id'].tolist()
        if not all_books:
            raise ValueError("CSV文件中没有图书ID")

        # 随机选择主要图书和次要图书
        focus_books = random.sample(all_books, min(focus_count, len(all_books)))
        other_books = random.sample([book for book in all_books if book not in focus_books],
                                    min(other_count, len(all_books) - len(focus_books)))

        print(f"主要图书ID: {focus_books}")
        print(f"次要图书ID: {other_books}")
        return focus_books, other_books
    except Exception as e:
        print(f"加载图书ID时出错: {e}")
        # 如果出错，返回默认值
        return [f"book_{i}" for i in range(1, focus_count + 1)], [f"book_{i}" for i in
                                                                  range(focus_count + 1, focus_count + other_count + 1)]


def generate_iso8601_time():
    """生成符合ISO 8601格式的时间（包含毫秒和时区）"""
    now = datetime.now(timezone.utc)
    random_seconds = random.randint(0, 30 * 24 * 60 * 60)  # 30天内的随机秒数
    random_microseconds = random.randint(0, 999999)
    dt = now - timedelta(seconds=random_seconds)
    return dt.strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + "+00:00"


def generate_note_content():
    """生成笔记内容（HTML格式）"""
    template = random.choice(CONTENT_TEMPLATES)
    return template.format(
        insight=random.choice(INSIGHTS),
        method=random.choice(["生动形象", "严谨逻辑", "深入浅出", "系统全面"]),
        theme=random.choice(THEMES),
        highlight=random.choice(["主人公的成长历程", "作者独特的视角", "书中的实证研究", "理论的实际应用"]),
        concept=random.choice(["终身学习", "批判性思维", "创新精神", "同理心"]),
        example=random.choice(["乔布斯的故事", "亚马逊的发展历程", "爱因斯坦的思考方式", "中国古代的智慧"]),
        gain=random.choice(["拓宽了视野", "学到了新方法", "改变了旧观念", "获得了实用技巧"]),
        quote=random.choice(QUOTES),
        thought=random.choice(["这与我的经历很相似", "这给了我新的启发", "我对此有不同的看法", "这值得深入思考"]),
        application=random.choice(["工作中可以借鉴", "教育孩子时可以用到", "自我提升的方向", "团队管理的启示"])
    )


def generate_tags():
    """生成随机标签"""
    tag_categories = [
        ["文学", "小说", "散文", "诗歌"],
        ["科技", "互联网", "人工智能", "编程"],
        ["历史", "文化", "考古", "传记"],
        ["经济", "金融", "商业", "管理"],
        ["心理", "哲学", "自我提升", "沟通"]
    ]
    category = random.choice(tag_categories)
    return random.sample(category, k=random.randint(1, 3))


def generate_notes(user_ids, focus_books, other_books, num_notes=1000, focus_ratio=0.9):
    """
    生成笔记数据，使图书ID更集中
    :param user_ids: 用户ID列表
    :param focus_books: 主要图书ID列表
    :param other_books: 次要图书ID列表
    :param num_notes: 总笔记数量
    :param focus_ratio: 主要图书占据的比例
    :return: 笔记数据（DataFrame）
    """
    notes = []
    total_focus = int(num_notes * focus_ratio)
    total_other = num_notes - total_focus

    print(f"生成 {total_focus} 条主要图书笔记，{total_other} 条次要图书笔记。")

    # 生成主要图书笔记
    for _ in tqdm(range(total_focus), desc="生成主要图书笔记"):
        create_time = generate_iso8601_time()
        note = {
            "u_id": random.choice(user_ids),
            "b_id": random.choice(focus_books),
            "title": random.choice(NOTE_TITLES),
            "content": generate_note_content(),
            "images": [],
            "tags": generate_tags(),
            "status": 0,
            "createTime": create_time,
            "updateTime": create_time
        }
        notes.append(note)

    # 生成次要图书笔记
    for _ in tqdm(range(total_other), desc="生成次要图书笔记"):
        create_time = generate_iso8601_time()
        note = {
            "u_id": random.choice(user_ids),
            "b_id": random.choice(other_books),
            "title": random.choice(NOTE_TITLES),
            "content": generate_note_content(),
            "images": [],
            "tags": generate_tags(),
            "status": 0,
            "createTime": create_time,
            "updateTime": create_time
        }
        notes.append(note)

    # 打乱笔记顺序
    random.shuffle(notes)

    # 转换为DataFrame
    notes_df = pd.DataFrame(notes)

    # 统计图书ID分布
    book_distribution = notes_df['b_id'].value_counts()
    print("图书ID分布情况：")
    print(book_distribution)

    return notes_df


def save_to_csv(df, output_path):
    """保存为CSV文件"""
    df.to_csv(output_path, index=False, encoding='utf-8-sig')
    print(f"数据已保存到 {output_path} (共{len(df)}条记录)")


def save_to_mongodb(df, db_name='test', collection_name='note'):
    """保存到MongoDB"""
    client = pymongo.MongoClient("mongodb://localhost:27017/")
    db = client[db_name]
    collection = db[collection_name]
    collection.delete_many({})
    # 转换时间字符串为datetime对象
    records = df.to_dict('records')
    for record in records:
        for field in ['createTime', 'updateTime']:
            if record[field]:
                try:
                    record[field] = datetime.strptime(
                        record[field],
                        "%Y-%m-%dT%H:%M:%S.%f+00:00"
                    )
                except ValueError:
                    # 如果时间格式不匹配，尝试其他格式或处理
                    continue

    result = collection.insert_many(records)
    print(f"成功插入 {len(result.inserted_ids)} 条数据到MongoDB {db_name}.{collection_name}")


if __name__ == "__main__":
    # ====================
    # 参数设置
    # ====================
    NUM_USERS = 20
    TOTAL_NOTES = 200
    FOCUS_RATIO = 0.75  # 90% 的笔记集中在主要图书上
    FOCUS_COUNT = 15  # 主要图书数量
    OTHER_COUNT = 5  # 次要图书数量

    # ====================
    # 1. 生成用户ID和加载图书ID
    # ====================
    user_ids = load_user_ids(num_users=NUM_USERS)
    focus_books, other_books = load_book_ids(
        csv_path="../../../file/ids.csv",
        focus_count=FOCUS_COUNT,
        other_count=OTHER_COUNT
    )

    # ====================
    # 2. 生成笔记数据
    # ====================
    notes_df = generate_notes(
        user_ids=user_ids,
        focus_books=focus_books,
        other_books=other_books,
        num_notes=TOTAL_NOTES,
        focus_ratio=FOCUS_RATIO)

    # ====================
    # 3. 保存数据
    # ====================
    save_to_csv(notes_df, "generated_notes.csv")
    save_to_mongodb(notes_df)